package net.lzzy.practices.utils;

import net.lzzy.practices.web.models.VmUser;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * @author liaodcc.
 */
//（配置为组件，以便被Spring Boot组件扫描时找到），便可在其中读取配置文件
@Component
public class AuthUtils {
    /**
     * 保留登录用户数据
     */
    public static final List<VmUser> USERS = new ArrayList<>();

    private static int minutes;

    @Value("${app.over.minutes}")
    public  void setMinutes(int minutes) {
        AuthUtils.minutes = minutes;
    }

    /**
     *使用参数传递的token获取用户对象
     * @param token
     * @return User
     */
    public static VmUser getUser(String token){
        return USERS
                .stream()
                .filter(u -> u.getToken().equals(token))
                .findFirst()
                .orElse(null);
    }

    /**
     *判断距离上次使用token访问接口的分钟数是否超时，超时则将该用户从VmUser集合中移除
     * @param userId
     * @param token
     * @return
     */
    public static boolean invalid(UUID userId,String token){
        VmUser user = getUser(token);
        if (user == null ||isOverTime(user)){
            return true;
        }
        boolean valid = user.getId().equals(userId);
        if (valid){
            user.setLastLogin(new Date());
        }
        return !valid;
    }
    private static boolean isOverTime(VmUser user){
        long offMillis = System.currentTimeMillis() - user.getLastLogin().getTime();
        long minutes = offMillis / (1000*60);
        boolean over = minutes > AuthUtils.minutes;
        if(over){
            USERS.remove(user);
        }
        return over;
    }
    /**
     * 判断当前用户(token)是否是合法用户
     */
    public static boolean illegalUser(String token,int[] allowedRoles){
        VmUser user = getUser(token);
        if (user == null || isOverTime(user)){
            return true;
        }
        user.setLastLogin(new Date());
        return Arrays.stream(allowedRoles).noneMatch(r -> r == user.getType());
    }

    /**
     * 注销用户
     * @param token
     * @return 成功或者失败
     */
    public static String logout(String token){
        VmUser user = getUser(token);
        if(user == null){
            return"注销失败，未发现登录记录";
        }
        USERS.remove(user);
        return"注销成功";
    }
}
